package study.itwill.team5.member;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import study.itwill.common.DateTime;
import study.itwill.common.FileIO;

/**
 * 회원 - 추가, 수정, 삭제, 조회, 리스트(검색포함), 로그인, 로그아웃, 회원DB저장 기능을 가진 클래스
 */
public class Member {
	
	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(Member.class);
		
	private static final String TABLE = "member";
	
	// 데이터베이스 제어 객체에 대한 참조
	DBHandler db = null;
	
	/** 현재시간 데이터 저장을 위한 SQL구문 작성 */
	String datetime = DateTime.getInstance().getNowDateTimeString();
	
	public Member() {
		// DB객체에 대한 참조 연결
		db = DBHandler.getInstance();
	}
	
	/**
	 * 회원 추가
	 * @param email1     - 이메일 앞주소
	 * @param email2     - 이메일 뒷주소
	 * @param nickname  - 별명
	 * @param user_pw   - 비밀번호
	 * @param user_name - 회원이름
	 * @param gender    - 성별
	 * @param birthday  - 생년월일
	 * @param hp1       - 휴대폰 앞자리
	 * @param hp2       - 휴대폰 중간자리
	 * @param hp3       - 휴대폰 뒷자리
	 * @return     int  - 추가된 회원의 일련번호
	 */
	public int addMember(String email1, String email2, String nickname, String user_pw,
			String user_name, String gender, String birthday, String hp1, String hp2, String hp3) {
		//-----------------------------------------
		// 메서드 시작
		//-----------------------------------------
		logger.debug("=============== method start >> addMember");
		logger.debug("[PARAMS] email1=" + email1);
		logger.debug("[PARAMS] email2=" + email2);
		logger.debug("[PARAMS] nickname=" + nickname);
		logger.debug("[PARAMS] user_pw=" + user_pw);
		logger.debug("[PARAMS] user_name=" + user_name);
		logger.debug("[PARAMS] gender=" + gender);
		logger.debug("[PARAMS] birthday=" + birthday);
		logger.debug("[PARAMS] hp1=" + hp1);
		logger.debug("[PARAMS] hp2=" + hp2);
		logger.debug("[PARAMS] hp3=" + hp3);
		
		int seq = -1;
		
		// SQL 인젝션 방어
		email1 = email1.replace("'", "\'");
		email2 = email2.replace("'", "\'");
		nickname = nickname.replace("'", "\'");
		user_pw = user_pw.replace("'", "\'");
		user_name = user_name.replace("'", "\'");
		gender = gender.replace("'", "\'");
		birthday = birthday.replace("'", "\'");
		hp1 = hp1.replace("'", "\'");
		hp2 = hp2.replace("'", "\'");
		hp3 = hp3.replace("'", "\'");
		
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO member("
	            + "email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date"
	            + ") VALUES ('%s', '%s', '%s', password('%s'), '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');";
		
		boolean result = db.execSql(sql, email1, email2, nickname, user_pw, user_name, gender,
				birthday, hp1, hp2, hp3, datetime, datetime);
		
		//-----------------------------------------
		// 결과처리
		//-----------------------------------------
		if(result) {
			db.commit();
			seq = db.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 회원 추가 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 회원 추가 실패");
		}
		
		logger.debug("=============== method end >> addMember");
		
		return seq;
	}
	
	/**
	 * 회원정보 수정
	 * @param seq			- 회원일련번호
	 * @param email1        - 이메일 앞주소
	 * @param email2        - 이메일 뒷주소
	 * @param nickname  	- 별명
	 * @param user_pw   	- 비밀번호
	 * @param user_name 	- 회원이름
	 * @param gender    	- 성별
	 * @param birthday  	- 생년월일
	 * @param hp1  	        - 휴대폰 앞자리
	 * @param hp2           - 휴대폰 중간자리
	 * @param hp3           - 휴대폰 뒷자리
	 * @return true     	- 회원정보 수정 성공 / false - 회원정보 수정 실패
	 */
	public boolean editMember(int seq, String email1, String email2,String nickname, String user_pw,
			String user_name, String gender, String birthday, String hp1, String hp2, String hp3) {
		logger.debug("=============== method start >> editMember");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] email1=" + email1);
		logger.debug("[PARAMS] email2=" + email2);
		logger.debug("[PARAMS] nickname=" + nickname);
		logger.debug("[PARAMS] user_pw=" + user_pw);
		logger.debug("[PARAMS] user_name=" + user_name);
		logger.debug("[PARAMS] gender=" + gender);
		logger.debug("[PARAMS] birthday=" + birthday);
		logger.debug("[PARAMS] hp1=" + hp1);
		logger.debug("[PARAMS] hp2=" + hp2);
		logger.debug("[PARAMS] hp3=" + hp3);
		
		// SQL 인젝션 방어
		email1 = email1.replace("'", "\'");
		email2 = email2.replace("'", "\'");
		nickname = nickname.replace("'", "\'");
		user_pw = user_pw.replace("'", "\'");
		user_name = user_name.replace("'", "\'");
		gender = gender.replace("'", "\'");
		birthday = birthday.replace("'", "\'");
		hp1 = hp1.replace("'", "\'");
		hp2 = hp2.replace("'", "\'");
		hp3 = hp3.replace("'", "\'");
		
		boolean result = false;
		
		db.beginTrans();
		
		String sql = "UPDATE member "
				+ "SET email1 = '%s', email2 = '%s', nickname = '%s', user_pw = password('%s'), user_name = '%s', gender = '%s', birthday = '%s', hp1 = '%s', hp2 = '%s', hp3 = '%s', edit_date = '%s' "
				+ "WHERE seq = %d;";
		
		result = db.execSql(sql, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, datetime, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 회원정보 수정성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 회원정보 수정 실패 ");
		}
		
		logger.debug("=============== method end >> editMember");
		
		return result;
	}
	
	/**
	 * 회원삭제
	 * @param seq		- 회원일련번호
	 * @return boolean	- true - 회원삭제 성공 / false - 회원삭제 실패
	 */
	public boolean deleteMember(int seq) {
		logger.debug("=============== method start >> deleteMember");
		logger.debug("[PARAMS] seq=" + seq);
		
		boolean result = false;
		
		db.beginTrans();
		
		String sql = "SELECT seq FROM board WHERE member_seq = %d;";
		ResultSet rs = db.getResult(sql, seq);
		ArrayList<Integer> list = null;
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<Integer>();
				while(rs.next()) {
					int list_seq = rs.getInt(1);
					list.add(list_seq);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		for (int i=0; i<list.size(); i++) {
			sql = "DELETE FROM comment WHERE board_seq = %d;";
			result = db.execSql(sql, list.get(i));
		}
		sql = "DELETE FROM board WHERE member_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM comment WHERE member_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM member_log WHERE member_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM wishlist WHERE member_seq = %d;";
		result = db.execSql(sql, seq);
		sql = "DELETE FROM member WHERE seq = %d;";
		result = db.execSql(sql, seq);
		
		if(result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 회원 계정 삭제 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteMember");
		
		return result;
	}
	
	/**
	 * 회원 계정조회
	 * @param	seq				- 회원일련번호
	 * @return	MemberItem		- 회원정보 한명의 계정을 객체로 리턴 
	 */
	public MemberItem viewMember(int seq) {
		logger.debug("=============== method start >> viewMember");
		logger.debug("[PARAMS] seq=" + seq);
		
		MemberItem item = null;
		
		// 데이터 조회
		String sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
				+ "FROM member "
				+ "WHERE seq = %d;";
		
		ResultSet rs = db.getResult(sql, seq);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int member_seq = rs.getInt(1); 
				String email1 = rs.getString(2);
				String email2 = rs.getString(3);
				String nickname = rs.getString(4);
				String user_pw = rs.getString(5);
				String user_name = rs.getString(6);
				String gender = rs.getString(7);
				String birthday = rs.getString(8);
				String hp1 = rs.getString(9);
				String hp2 = rs.getString(10);
				String hp3 = rs.getString(11);
				String reg_date = rs.getString(12);
				String edit_date = rs.getString(13);
				
				// 2) 추출된 값을 객체로 구성
				item = new MemberItem(member_seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
				
		logger.debug("=============== method end >> viewMember");
		
		return item;
	}
	
	/**
	 * 회원 계정 리스트조회
	 * @param	choice : 검색조건 (0:회원전체, 1:이메일, 2:닉네임, 3:이름, 4:성별, 5:생년월일, 6:핸드폰번호)
	 * @param	search : 검색값
	 * @return	ArrayList<MemberItem> - 회원목록을 객체배열 형태로 리턴 
	 */
	public ArrayList<MemberItem> listMember(int choice, String search) {
		logger.debug("=============== method start >> listMember");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<MemberItem> list = null;
		
		String sql = null;
		
		/*
		 *  회원 검색을 위한 파라미터 정의
		 *  0, null : 회원 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, "이메일 검색"
		 *  2, "닉네임 검색"
		 *  3, "이름 검색"
		 *  4, "성별 검색"
		 *  5, "생년월일 검색"
		 *  6, "핸드폰번호 검색"
		 */
		switch(choice) {
		case 0:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "ORDER BY seq DESC;";
			break;
			
		case 1:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE email1 like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
		
		case 2:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE nickname like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
			
		case 3:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE user_name like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
			
		case 4:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE gender like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
			
		case 5:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE birthday like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
			
		case 6:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE hp3 like '%%" + search + "%%' "
					+ "ORDER BY seq DESC;";
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE seq=-1;";
			break;
		}
			
		ResultSet rs = db.getResult(sql);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<MemberItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int seq = rs.getInt(1); 
					String email1 = rs.getString(2);
					String email2 = rs.getString(3);
					String nickname = rs.getString(4);
					String user_pw = rs.getString(5);
					String user_name = rs.getString(6);
					String gender = rs.getString(7);
					String birthday = rs.getString(8);
					String hp1 = rs.getString(9);
					String hp2 = rs.getString(10);
					String hp3 = rs.getString(11);
					String reg_date = rs.getString(12);
					String edit_date = rs.getString(13);
					
					// 2) 추출된 값을 객체로 구성
					MemberItem item = new MemberItem(seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listMember");
		
		return list;
	}
	
	/**
	 * 회원 계정 리스트조회
	 * @param	choice : 검색조건 (0:회원전체, 1:이메일, 2:닉네임, 3:이름, 4:성별, 5:생년월일, 6:핸드폰번호)
	 * @param	search : 검색값
	 * @param start - 검색 범위의 시작위치
	 * @param end - 한 페이지에 보여질 글의 목록 수
	 * @return	ArrayList<MemberItem> - 회원목록을 객체배열 형태로 리턴 
	 */
	public ArrayList<MemberItem> listMember(int choice, String search, int start, int end) {
		logger.debug("=============== method start >> listMember");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<MemberItem> list = null;
		
		String sql = null;
		
		/*
		 *  회원 검색을 위한 파라미터 정의
		 *  0, null : 회원 전체리스트 검색
		 *  		(전체리스트 검색은 오버로딩 정의로 숫자값 하나만을 파라미터로 받을수 있다)
		 *  1, "이메일 검색"
		 *  2, "닉네임 검색"
		 *  3, "이름 검색"
		 *  4, "성별 검색"
		 *  5, "생년월일 검색"
		 *  6, "핸드폰번호 검색"
		 */
		switch(choice) {
		case 0:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		case 1:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE email1 like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
		
		case 2:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE nickname like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		case 3:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE user_name like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		case 4:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE gender like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		case 5:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE birthday like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		case 6:
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE hp3 like '%%" + search + "%%' ORDER BY seq DESC LIMIT %d, %d;";
			break;
			
		default:
			System.out.println("검색조건 선택이 올바르지 않습니다.");
			sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
					+ "FROM member "
					+ "WHERE seq=-1 LIMIT %d, %d;";
			break;
		}
			
		ResultSet rs = db.getResult(sql, start, end);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<MemberItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int seq = rs.getInt(1); 
					String email1 = rs.getString(2);
					String email2 = rs.getString(3);
					String nickname = rs.getString(4);
					String user_pw = rs.getString(5);
					String user_name = rs.getString(6);
					String gender = rs.getString(7);
					String birthday = rs.getString(8);
					String hp1 = rs.getString(9);
					String hp2 = rs.getString(10);
					String hp3 = rs.getString(11);
					String reg_date = rs.getString(12);
					String edit_date = rs.getString(13);
					
					// 2) 추출된 값을 객체로 구성
					MemberItem item = new MemberItem(seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> listMember");
		
		return list;
	}
	
	/**
	 * 회원 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @return ArrayList<MemberItem>	- 0과 null을 오버로딩된 메서드로 반환
	 */
	public ArrayList<MemberItem> listMember(int choice) {
		return listMember(choice, null);
	}
	
	/**
	 * 회원 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @param start - 검색 범위의 시작위치
	 * @param end - 한 페이지에 보여질 글의 목록 수
	 * @return ArrayList<MemberItem>	- 0과 null을 오버로딩된 메서드로 반환
	 */
	public ArrayList<MemberItem> listMember(int choice, int start, int end) {
		return listMember(choice, null, start, end);
	}
	
	/**
	 * 로그인
	 * @param email		- 이메일
	 * @param user_pw	- 비밀번호
	 * @return boolean	- true - 로그인 성공 / false - 로그인 실패
	 */
	public boolean loginMember(String email1, String email2, String user_pw) {
		logger.debug("=============== method start >> loginMember");
		logger.debug("[PARAMS] email1=" + email1);
		logger.debug("[PARAMS] email2=" + email2);
		logger.debug("[PARAMS] user_pw=" + user_pw);
		
		boolean result = false;
		
		String sql = "select email1 from member where email1 = '%s' and email2 = '%s' and user_pw = password('%s');";
		
		ResultSet rs = db.getResult(sql, email1, email2, user_pw);
		
		String member_email  = null;
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				member_email = rs.getString(1);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(member_email == null) {
			result = false;
			logger.error("로그인 실패");
		} else {
			result = true;
			logger.debug(member_email + "님 로그인 성공");
		}
		
		logger.debug("=============== method end >> loginMember");
		
		return result;
	}
	
	/**
	 * 로그아웃
	 * @param email		- 이메일
	 * @return boolean	- true - 로그아웃 성공 / false - 로그아웃 실패
	 */
	public boolean logoutMember(String email1, String email2) {
		logger.debug("=============== method start >> logoutMember");
		logger.debug("[PARAMS] email1=" + email1);
		logger.debug("[PARAMS] email2=" + email2);
		
		boolean result = false;
		
		String sql = "select email1 from member where email1 = '%s' and email2 = '%s';";
		
		ResultSet rs = db.getResult(sql, email1, email2);
		
		String member_email  = null;
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				member_email = rs.getString(1);
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(member_email == null) {
			result = false;
			logger.error("로그아웃 실패");
		} else {
			result = true;
			logger.debug(member_email + "님 로그아웃 성공");
		}
		
		logger.debug("=============== method end >> logoutMember");
		
		return result;
	}
	
	/**
	 * 회원정보 파일로 저장
	 * @return boolean		- true - 회원정보 파일로 저장 성공 / false - 회원정보 파일로 저장 실패
	 */
	public boolean saveMember() {
		logger.debug("=============== method start >> saveMember");
		
		ArrayList<MemberItem> list = null;
		
		// 데이터 조회
		String sql = "SELECT seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date "
				+ "FROM member;";
		
		ResultSet rs = db.getResult(sql);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<MemberItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int seq = rs.getInt(1); 
					String email1 = rs.getString(2);
					String email2 = rs.getString(3);
					String nickname = rs.getString(4);
					String user_pw = rs.getString(5);
					String user_name = rs.getString(6);
					String gender = rs.getString(7);
					String birthday = rs.getString(8);
					String hp1 = rs.getString(9);
					String hp2 = rs.getString(10);
					String hp3 = rs.getString(11);
					String reg_date = rs.getString(12);
					String edit_date = rs.getString(13);
					
					// 2) 추출된 값을 객체로 구성
					MemberItem item = new MemberItem(seq, email1, email2, nickname, user_pw, user_name, gender, birthday, hp1, hp2, hp3, reg_date, edit_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		boolean result = false;
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
			
			String path = "output/member_" + datetime + ".csv";
			String str = "일련번호,이메일1,이메일2,닉네임,이름,성별,생년월일,연락처1,연락처2,연락처3,가입일자,수정일자\n";
			
			for (int i=0; i<list.size(); i++) {
				MemberItem temp = list.get(i);
				str += temp.getSeq() + "," + temp.getEmail1() + "," + temp.getEmail1() + "," + temp.getNickname() + "," +
				temp.getUser_name() + "," + temp.getGender() + "," + temp.getBirthday() + "," + temp.getHp1() + "," +
				temp.getHp2() + "," + temp.getHp3() + "," +	temp.getReg_date() + "," + temp.getEdit_date() + "\n";
			}
			
			FileIO fileIo = FileIO.getInstance();
			fileIo.write(path, str);
			
			result = true;
			logger.debug("파일로 저장 성공");
		}
		
		logger.debug("=============== method end >> saveMember");
		
		return result;
	}
}
